package com.fa7.trabalho.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fa7.trabalho.dao.PerfilDao;
import com.fa7.trabalho.entidades.Perfil;
import com.fa7.trabalho.entidades.SeguidorSeguinte;
import com.fa7.trabalho.regex.ValidaNomeMensagem;

@Service("perfilService")
public class PerfilService {
	
	@Autowired
	private PerfilDao perfilDao;
	
	@Autowired 
	private MensagemService mensagemService;
	
	public Perfil verificaExistencia(String nomePerfil){
		Perfil perfil = perfilDao.findByNome(nomePerfil);
		if(perfil != null){
			return perfil;
		}	
		
		return null;
	}
	
	public void enviarMensagemPerfil(String mensagem, Perfil perfilLogado){
		List<String> nomes = ValidaNomeMensagem.retornaNomeMensagens(mensagem);
		if(!nomes.isEmpty()){
			enviarMensagemParaNomeCitado(mensagem, perfilLogado, nomes);
		} else {
			mensagemService.enviarMensagem(perfilLogado, null, mensagem);
		}
	}
	
	public void enviarMensagemParaNomeCitado(String mensagem, Perfil perfilLogado, List<String> nomes){
		for (String nome : nomes) {
			Perfil perfilCitado = verificaExistencia(nome);
			if(perfilCitado != null) {
				if(perfilCitado.getId() != perfilLogado.getId()){
				mensagemService.enviarMensagem(perfilLogado, perfilCitado, mensagem);
				}
			} else {
				mensagemService.enviarMensagem(perfilLogado, null, mensagem);
			}
		}
	}

	public PerfilDao getPerfilDao() {
		return perfilDao;
	}

	public void setPerfilDao(PerfilDao perfilDao) {
		this.perfilDao = perfilDao;
	}

	public List<Perfil> retornaSugestoesDePessoas(Perfil perfilUsuario) {
		
		Perfil perfilAtualizado = perfilDao.findOne(perfilUsuario.getId());
		List<SeguidorSeguinte> seguintes = perfilAtualizado.getSeguintes();
		List<Perfil> perfisSugeridos = new ArrayList<Perfil>();
		if(seguintes != null && !seguintes.isEmpty()){
			for(SeguidorSeguinte seguinte : seguintes){
				perfisSugeridos.addAll(retornaSeguintes(seguinte, perfilUsuario));			
			}
		}

		return perfisSugeridos;
	}
	
	private List<Perfil> retornaSeguintes(SeguidorSeguinte seguinte, Perfil perfilUsuario){
		List<Perfil> perfisSeguintes = new ArrayList<Perfil>();
		List<SeguidorSeguinte> seguintes = new ArrayList<SeguidorSeguinte>();
		Perfil perfilAtualizado = perfilDao.findOne(seguinte.getSeguinte().getId());
		seguintes = perfilAtualizado.getSeguintes();
		if(seguintes != null && !seguintes.isEmpty()){
			for(SeguidorSeguinte seguinteAtual : seguintes){
				if(!isSeguinte(perfilUsuario, seguinteAtual.getSeguinte())){
					perfisSeguintes.add(seguinteAtual.getSeguinte());
				}
			}
		}
		return perfisSeguintes;
		
	}
	
	public boolean isSeguinte(Perfil perfil, Perfil possivelSeguinte){
		List<SeguidorSeguinte> seguintes = new ArrayList<SeguidorSeguinte>();
		Perfil perfilAtualizado = perfilDao.findOne(perfil.getId());
		seguintes = perfilAtualizado.getSeguintes();
		if(seguintes != null && !seguintes.isEmpty()){
			for(SeguidorSeguinte seguinteAtual : seguintes){
				if(possivelSeguinte.getId().equals(seguinteAtual.getSeguinte().getId())){
					return true;
				}
			}
		}
		
		return false;
	}
	
	
	
	

}
